package com.atguigu.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * 整合Mybatis-plus  导入依赖
 *
 * 配置：
 *  配置数据源
 *  配置mybatis-plus
 *      接口地址
 *      sql文件地址
 *
 *  逻辑删除 mybatis-plus
 *     1. 配置全局删除数值 1/0
 *     2. 3.1.8以前配置逻辑删除插件
 *     3. 加上逻辑删除注解 @TableLogic
 *
 *
 *  jsr303:
 *      1.实体类添加校验注解
 *      2.开启校验功能。在对应的接口中增加 @Valid 校验才会起作用
 *      3.紧跟验校的bean之后增加 BindingResult 可以绑定校验结果
 *      4.同一异常处理
 *
 *      分组校验：
 *          定义分组校验接口
 *          在bean上设定分组数据
 *          在接口中 添加 @Validated注解，启用分组校验
 *          没有指定分组的校验注解，在分组校验情况下不生效，只会在不分组校验时生效
 *          自定义校验：
 *              编写自定义校验注解
 *              定义自定义校验器
 *
 *  redisson安装使用
 *      lock() 是阻塞式等待
 *          // 锁的自动续期，如果业务超长，运行期间自动给锁续上新的30s
 *          // 加锁的因为业务只要运行完成，就不会给当前所续期，及时不手动解锁，30s后也会自动删除
 *
 *          // 当指定了超时时间时，自动解锁时间一定要大于业务执行时间，因为不会自动续期
 *          // 如果未指定加锁时间，默认加锁时间是30s，占锁成功后会启动一个定时任务，给锁续期
 *          续期的周期是 看门狗时间/3
 *
 *  整合springcache步骤
 *     1.引入依赖 spring-boot-starter-cache spring-boot-starter-data-redis
 *      2.写配置：
 *          1.自动配置了哪些内容：CacheAutoConfiguration 导入RedisCacheConfiguration,自动配置好了缓存管理器 RedisCacheManager
 *          2.配置使用redis作为缓存
 *      3.使用缓存：
 *          @Cacheable 触发缓存保存操作，代表当前方法的结果需要缓存，如果结果中有，方法不用调用，如果没有，则调用方法
 *                      每一个需要缓存的数据我们都要指定要放到那个名字的缓存（缓存分区） 按照业务类型
 *                      KEY 是默认生成的 缓存的名字：：simpleKey
 *                      value:使用jdk序列化
 *                      缓存时间：默认-1
 *                      自定义：
 *                          指定生成的缓存使用的key：接收spel表达式，常量字符串需要使用"'aa'"
 *                          指定缓存的时间：配置文件中的时间为ms spring.cache.redis.time-to-live
 *                          保存数据为json格式
 *                          自定义缓存管理器：
 *                              RedisCacheConfiguration配置了 redisCacheManager
 *                              缓存的自动配置CacheAutoConfiguration 导入RedisCacheConfiguration
 *                              自动配置了 RedisCacheManager 初始化所有缓存->决定使用什么缓存
 *                              ->自定义的配置如果有，就用自定义的
 *          @CacheEvict 驱逐缓存 value=aa,allEntries=true 清除同一分区内容
 *          @CachePut 更新后重新放置
 *              双写模式，失效模式
 *          @Caching 组合注解 eg:更新时需要删除多个缓存可以使用此注解
 *          实战时使用分区作为缓存前缀
 *
 *      4.开启缓存功能@EnableCaching
 *
 *      注解读模式：
 *          缓存穿透：spring.cache.redis.cache-null-values=true
 *          缓存雪崩：随机时间，但是一般不用，防止弄巧成拙
 *          缓存击穿：未处理，可以加上sync=true
 *      注解写模式：
 *          读写加锁
 *          canal中间件
 *          读多写多，直接查数据库
 *
 *      常规数据：读多写少：读：spring-cache就可以满足，一致性要求不高；写：缓存过期时间
 *
 *
 *
 */
@EnableDiscoveryClient
@MapperScan("com.atguigu.gulimall.product.dao")
@SpringBootApplication
public class GulimallProduct {
    public static void main(String[] args) {
        SpringApplication.run(GulimallProduct.class,args);
    }
}
